package PRO;

import java.io.*;
import java.math.BigInteger;

public class ejecucion {

    public static void RSA() throws IOException {

        long comienzo, fin, comienzo1, fin1;

        System.out.println("\nAplicación del algoritmo de cifrado RSA");
        System.out.print("\n\nTenemos que definir el tamaño de los números primos" + "\nEl tamaño esta definido en bytes");
        System.out.println("por ejemplo número 512 equivale a generar un número de 512 bytes");
        System.out.println("Por favor ingrese el tamaño deseado, recuerde a mayor tamaño, mayor seguridad, pero mayor tiempo de ejecución: ");
        String Entrada = (new BufferedReader(new InputStreamReader(System.in))).readLine();

        int sizeNum = Integer.parseInt(Entrada);;
        //int sizeNum = z;

        System.out.println("\nElija el tipo de descifrado que desea usar");
        System.out.println("1=normal 2=teorema chino ");

        Entrada = (new BufferedReader(new InputStreamReader(System.in))).readLine();
        int descifradoTipo = Integer.parseInt(Entrada);
        Rsa prueb = new Rsa(sizeNum, descifradoTipo);
        System.out.println("Tamaño de la clave: [" + sizeNum + "] bytes \n");
        System.out.println("p: [" + prueb.varp() + "]");
        System.out.println("q: [" + prueb.varq() + "]");
        System.out.println("n: [" + prueb.varn() + "]\n");
        if (prueb.varp().isProbablePrime(1) == true) {
            System.out.println("¿El numero p es primo? : Si");
        } else {
            System.out.println("¿El numero p es primo? : No");
        }

        if (prueb.varq().isProbablePrime(1) == true) {
            System.out.println("¿El numero q es primo? : Si");
        } else {
            System.out.println("¿El numero q es primo? : No");
        }

        System.out.println("\nClaves (e,d)");
        System.out.println("e: [" + prueb.vare() + "]");
        System.out.println("d: [" + prueb.vard() + "]\n");

        System.out.println("Texto a encriptar: ");
        Entrada = (new BufferedReader(new InputStreamReader(System.in))).readLine();
        BigInteger[] texto = prueb.cifrar(Entrada);

        System.out.println("\nTexto encriptado: [");

        for (int i = 0; i < texto.length; i++) {
            System.out.print(texto[i]);
            if (i != texto.length - 1) {
                System.out.print("\n");
            }
        }
        System.out.println("\n]\n");

        comienzo = System.nanoTime();
        comienzo1 = System.currentTimeMillis();

        String recuperarTexto = prueb.descifrar(texto);
        fin = System.nanoTime();
        fin1 = System.currentTimeMillis();
        long tiempo = (fin - comienzo);
        long tiempo1 = (fin1 - comienzo1);
        System.out.println("El proceso de descifrado se ejecutó en " + tiempo + " nanosegundos");
        System.out.println("Redondeado en " + tiempo1 + " milisegundos");
        System.out.println("\n Texto desencriptado: [" + recuperarTexto + "]");
        System.out.println("¿Desea realizar un ataque al sistema? 1=si 2=no");
        int atack = Integer.parseInt((new BufferedReader(new InputStreamReader(System.in))).readLine());

        if (atack == 1) {
            System.out.println("\nElija el tipo de factorizacion para el ataque");
            System.out.println("1=Fermat 2=Rho pollard ");

            int ataque1 = 1;
            Entrada = (new BufferedReader(new InputStreamReader(System.in))).readLine();
            ataque1 = Integer.parseInt(Entrada);
            System.out.println("\nElija el tipo de descifrado que desea usar para el ataque");
            System.out.println("1=normal 2=teorema chino ");

            Entrada = (new BufferedReader(new InputStreamReader(System.in))).readLine();
            descifradoTipo = Integer.parseInt(Entrada);
            if (ataque1 == 1) {

                AtaqueFactFermat factFermat = new AtaqueFactFermat(prueb.varn(), prueb.vare(), texto, descifradoTipo);
                factFermat.iniciar();

            }
            if (ataque1 == 2) {

                AtaqueRhoPollard factRho = new AtaqueRhoPollard(prueb.varn(), prueb.vare(), texto, descifradoTipo);
                factRho.iniciar();

            }

        }
    }
}
